home *** CD-ROM | disk | FTP | other *** search
- ┌──────────────────────────────────────────────────────────────────────────┐
- │┌────────────────────────────────────────────────────────────────────────┐│
- ││ ││
- ││ QuickBasic'de karƒìlaƒtìºìm sorunlarì nasìl aƒtìm? ││
- ││ ││
- ││ Konu: Modemin Basic'de programlanmasì (#3) ││
- ││ ││
- │└────────────────────────────────────────────────────────────────────────┘│
- │ PS 29 · Aralìk'95 Gürol Demir │
- └──────────────────────────────────────────────────────────────────────────┘
-
-
- ÿki aydìr devam eden yazì dizimizde aºìrlìklì olarak modem programlama
- için gerekli olan donanìm ve makine dili bilgileri vermiƒtik. Bu bilgilerin
- desteºi ile artìk bizim tanìdìºìmìz basic diline yeniden merhaba diyebiliriz.
-
- Modem programlamada gerekli basic komutlarìna göz atalìm.
-
- ┌─────────────────────┐
- ────────────────────────────┤ OPEN "COM... Deyimi ├──────────────────────────
- └─────────────────────┘
-
- Amacì : Bir iletiƒim dosyasì açmak
- Dili : GwBasic, TurboBasic, Qbasic, QuickBasic, ....
- Format : OPEN "COMn:[parametreler] FOR RANDOM AS #DosyaNo
-
-
- COMn : Seri geniƒleme yuvasìnìn numarasìdìr. Com1 veya Com2 olabilir,
- diºerlerine (Com3,Com4) izin verilmez. Bu aynì zamanda IRQ3 ve
- IRQ4'den baƒkasìna da izin verilmeyeceºi anlamìndadìr.
-
- DosyaNo : Basic'in okuma yazma iƒlemleri için kullanacaºì numaradìr.
-
- Parametreler : Hìz + Parite + Geniƒlik + Dur + Önemsiz diºer parametrelerdir.
-
- Hìz : 75,(..),2400,4800, 9600 Bps'dir.Varsayìlan 300'dür.
- 9600 Bps'den hìzlì iletiƒime izin verilmez.
- Parite : Gönderme ve alma için karƒìlìk belirtir.
- S,O,M,E,N deºerlerini alabilirler. (tavsiye="N")
- Geniƒlik : ÿletiƒime konu karakter geniƒliºini belirtir.
- 4,5,6,7,8 deºerlerini alabilir. Varsayìm 7 dir.
- Varsayìlan uygulandìºìnda Türkçe karakterler modem
- yoluyla iletilemezler. Bu nedenle "8" kullanìlmak
- zorundadìr.
- Dur : Durdurma bitlerinin sayìsìnì gösterir. Yüksek hìzda
- daima "1" kullanìlìr.
-
- Diºer : Önemsizdir. Yine de help dosyasìna bakìnìz.
-
- Tipik bir iletiƒim dosyasì ƒu ƒekilde bir komutla açìlìr:
- ┌─────────────────────────────────────────┐
- │ OPEN "Com2:2400,N,8,1" FOR RANDOM AS #1 │
- └─────────────────────────────────────────┘
-
- Burda geçen;
-
- Com2 yerine sadece Com1 atternatifdir.
- 2400 yerine ise normal koƒullarda 4800 veya 9600 alternatif
- olabilir.
- N,8,1 yerine atternatif kullanmayìnìz.
- #1 yerine makinenizin izin verdiºi herhangi bir dosya
- numarasì olabilir.
-
-
- ┌─────────────────────────────────────────┐
- Soru > │ Basic OPEN "COM..." deyiminde ne yapar? │
- └─────────────────────────────────────────┘
-
- 1) Bellek ayìrìr : Basic baƒlarken "C" anahtarì ile bir iletiƒim
- bellek miktarì belirtilmiƒ ise (Örn. QBX /C:16000 gibi) bu büyüklükte, yoksa
- 512 byte büyüklüºünde bir belleºi iletiƒim de ambar olarak kullanmak üzere
- ayìrìr.
- 2) Bu komutla verilen dosya numarasì bundan böyle sanki bir fiziki
- dosya numarasì gibi görülsün diye ayarlamalar yapar.
-
- 3) Yeni bir interrupt rutini yazar. Eºer OPEN "Com1... ise bu rutini
- Ch kesmesine, OPEN"Com2... ise Bh kesmesine atar bundan evvel eski kesmelere
- ait adresleri saklar.
-
- Bu rutinde kullanìlmak üzere ilgili aygìtìn adresini eºer Com1
- ise 40h:00 dan, eºer Com2 ise 40h:02'den alìr.
-
- 4) Modem portunu yani 40h:00 veya 40:02'den aldìºì adresin bir
- fazlasìnì IRQ üretmek için programlar (OUT &H3F9, 11 gibi).
-
- 5) 8259 chip'inden IRQ hattì için onay alìr (Com1 için IRQ4,
- Com2 için IRQ3).
-
- Yukardaki iƒlemlerden 3, 4 ve 5 nci maddeler bir basic programìnda
- müdahale edilmesi gerekenlerdir. Bunlarì daha evvel iƒledik. 1 ve 2 nci
- maddeler ise bizim basic'den ödünç alacaklarìmìzdìr.
-
- ┌─────────────────────────────────┐
- Soru > │ Modemim Com4'de ise ne olacak ? │
- └─────────────────────────────────┘
- Hemen basic dilini bìrakìp Delphi'ye geçin gibi acizlik belirtisi
- bir cevap vermeyeceºim ama sorunun GwBasic'deki cevabìnì bilmiyorum. Bu
- nedenle eºer GwBasic kullanìyorsanìz Qbasic veya Quick Basic'e geçmenin tam
- sìrasì diyerek GwBasic'de bu konudaki cahilliºimi ilan edebilirim.
-
- Qbasic ve üstü basic ailesinden diller Com1 ve Com2'nin adresini
- BIOS'dan alìrlar.
-
- ┌─────────────────────────────────┐
- │ Bios'da │
- │ 40h:00 Com1'in adresi │
- │ 40h:02 Com2'nin adresi │
- │ 40h:04 Com3'ün adresi │
- │ 40h:06 Com4'ün adresi │
- │ ƒeklinde tutulur │
- └─────────────────────────────────┘
-
- Eºer modeminiz Com4'de ise ve iletiƒim dosyasì OPEN "Com1... ile
- açìlacak ise tek yapacaºìnìz ƒey "OPEN" komutundan evvel bios'un 40h:00
- adresine &H2E8 adresini aktarmaktìr.
-
- ┌──────────────┐
- ──────────────────────────────┤ CLOSE Deyimi ├───────────────────────────────
- └──────────────┘
- Bu komutu modemi kapatmak için kullanacaºìz fazla bir esprisi
- yoktur. Format: CLOSE #DosyaNo (Örneºin CLOSE #1)
-
- >HangUp (Baºlantìnìn kesilmesi) :
-
- Modem kapatìlmadan evvel bir takìm iƒlemleri iptal edilmelidir.
- Kapatìlmaya çalìƒìlam modem o sìrada iletiƒim halinde veya bir telefon
- çevirmekte olabilir. Modem ƒu iƒlemler ile kapatìlmalìdìr:
-
- ┌───────────────────────────────────────┐
- │ PRINT #1, "ATH" │
- │ PRINT #1, CHR$(13) │
- │ PRINT #1, "ATZ" │
- │ OUT Port + 4, (INP(Port + 4) AND 252) │
- │ CLOSE #1 │
- └───────────────────────────────────────┘
-
- ┌──────────────┐
- ──────────────────────────────┤ PRINT Deyimi ├───────────────────────────────
- └──────────────┘
- Bu komutu modeme veri göndermek için kullanacaºìz fazla bir esprisi
- yoktur. Format: PRINT #DosyaNo,Veri$ (Örneºin PRINT #1, "ATZ")
-
- ┌─────────────────────────┐
- ──────────────────────────┤ INPUT$ ve LOC Deyimleri ├────────────────────────
- └─────────────────────────┘
- Bu komutlarì modemden veri okumak için kullanacaºìz fazla bir
- esprileri yoktur. (Örneºin A$ = INPUT$(LOC(1),#1)
-
-
- ┌────────────────────────────┐
- ────**──**───******──────┤ Laf bitti, ƒimdi iƒ zamanì ├───────******──**──**─
- └────────────────────────────┘
- Buraya kadar öºrendiklerimiz sayesinde ter türlü modemi basic'de
- programlayabiliriz. Parçalarì nasìl birleƒtireceºiz? Aƒaºìda verilen örneºi
- iyi incelemenizi öneririm. Aƒaºìda verilen yordamlarda mikro iƒlemcinin
- basic'e esir düƒmesinin bir yìllìk özeti yer almaktadìr.
-
- >ÿƒte size bir terminal programì çekirdeºi:
-
- ┌───────────────────────┐
- │ Baƒlangìç Tavsiyeleri │
- ┌──────────────────────┴───────────────────────┴───────────────────────┐
- │'QBASIC'de de çalìƒìr │
- │' bu dilde bellek sorunu nedeniyle yavaƒ bir hìz seçiniz. │
- │ │
- │'QuickBasic de çalìƒmasì için ise versiyon 7.1 QBX /L QBX /C:32000 │
- │' versiyon 4.5 QB /L QB /C:32000 │
- │' ƒeklinde yüklenmelidir. │
- └──────────────────────────────────────────────────────────────────────┘
-
- ┌───────────────────────┐
- │ Ana Program │
- ┌───────────┴───────────────────────┴──────────────┐
- │DECLARE SUB EkranAc (Tip!) │
- │DECLARE SUB Terminal () │
- │DECLARE SUB ModemiKapa (ModemAdresi!) │
- │DECLARE SUB ModemiAc (ModemAdresi!, Hiz!, IrqNo!) │
- │ │
- │DIM SHARED Sakla(27) │
- │ │
- │'=================================================│
- │'Deºiƒkenler │
- │'Kendi modem bilgilerinizi giriniz │
- │ │
- │ Irq = 5: Port = &H3E8: Baud = 57600: Ansi = 1 │
- │ │
- │'Seçenekler │
- │'Irq = 2: Port = &H2E8: Baud = 2400 : Ansi = 1 │
- │'Irq = 3: Port = &H2F8: Baud = 4800 : Ansi = 0 │
- │'Irq = 4: Port = &H3E8: Baud = 9600 │
- │'Irq = 5: Port = &H3F8: Baud = 14400 │
- │'Irq = 7 : Baud = 19200 │
- │' Baud = 38400 │
- │' Baud = 57600 │
- │' Baud = 115200 │
- │ │
- │'=================================================│
- │'Program baƒlangìcì │
- │CALL ModemiAc(Port, Baud, Irq) │
- │EkranAc (Ansi) │
- │Terminal │
- │ModemiKapa (Port) │
- │END │
- │ │
- │ │
- │'=================================================│
- │'IRQ hattìnìn açìlmasì için makine dili yordamì │
- │IRQSerbest: │
- │DATA &H50 : 'PUSH AX │
- │DATA &H53 : 'PUSH BX │
- │DATA &H51 : 'PUSH CX │
- │DATA &HFA : 'CLI │
- │DATA &H31, &HC9 : 'XOR CX,CX │
- │DATA &HB1, 2 : 'MOV CL,02 │
- │DATA &HBB, 1, 0 : 'MOV BX,0001 │
- │DATA &HD3, &HE3 : 'SHL BX,CL │
- │DATA &HF7, &HD3 : 'NOT BX │
- │DATA &HE4, &HA1 : 'IN AL,A1 │
- │DATA &H20, &HF8 : 'AND AL,BH │
- │DATA &HE6, &HA1 : 'OUT A1,AL │
- │DATA &HE4, &H21 : 'IN AL,21 │
- │DATA &H20, &HD8 : 'AND AL,BL │
- │DATA &HE6, &H21 : 'OUT 21,AL │
- │DATA &HFB : 'STI │
- │DATA &H59 : 'POP CX │
- │DATA &H5B : 'POP BX │
- │DATA &H58 : 'POP AX │
- │DATA &HCB : 'RETF │
- └──────────────────────────────────────────────────┘
- ┌───────────────────────┐
- │ Ekran Açma Yordamì │
- ┌────────┴───────────────────────┴────────┐
- │'Ekran Ansi veya TTY modda açìlìyor │
- │SUB EkranAc (Tip) │
- │ IF Tip = 1 THEN │
- │ OPEN "CON" FOR OUTPUT AS #2 'Ansi │
- │ ELSE │
- │ OPEN "SCRN:" FOR OUTPUT AS #2 'TTY │
- │ END IF │
- │END SUB │
- └─────────────────────────────────────────┘
-
- ┌───────────────────────┐
- │ Modem Açma Yordamì │
- ┌─────────────────┴───────────────────────┴────────────────┐
- │SUB ModemiAc (ModemAdresi, Hiz, IrqNo) │
- │'Bazì deºerler saklanìyor │
- │ DEF SEG = 0 │
- │ FOR I = 40 TO 63 'ÿnterrupt adresleri │
- │ Sakla(I - 40) = PEEK(I) │
- │ NEXT │
- │ Sakla(24) = INP(&H21) '8259 (PIC) deºerleri │
- │ Sakla(25) = INP(&HA1) │
- │ Sakla(26) = PEEK(1026) 'Com2 eski aygìt adresi │
- │ Sakla(27) = PEEK(1027) │
- │ │
- │'=========================================================│
- │'Com2'ye bizim modem atanìyor │
- │ POKE 1027, ModemAdresi \ 256 │
- │ POKE 1026, ModemAdresi AND 255 │
- │ │
- │'=========================================================│
- │'Yeni aygìt (bizim modem) açìlìyor │
- │ OPEN "Com2:2400,N,8,1" FOR RANDOM AS #1 │
- │ │
- │'=========================================================│
- │'Modem seçilen hìz için ayarlanìyor │
- │ Sakla = INP(ModemAdresi + 3) │
- │ OUT ModemAdresi + 3, 128 │
- │ OUT ModemAdresi, 115200 / Hiz │
- │ OUT ModemAdresi + 3, Sakla │
- │ │
- │'=========================================================│
- │'Com2'ye ait IRQ3 kapatìlìyor, PIC deºerleri iade ediliyor│
- │ OUT &H21, Sakla(24) │
- │ OUT &HA1, Sakla(25) │
- │ │
- │'=========================================================│
- │'Bizim modeme ait IRQ'nun, Com2'ye ait interruptu │
- │'kullanmasì saºlanìyor │
- │ IntAdres = (IrqNo + 8) * 4 │
- │ POKE IntAdres, PEEK(44) │
- │ POKE IntAdres + 1, PEEK(45) │
- │ POKE IntAdres + 2, PEEK(46) │
- │ POKE IntAdres + 3, PEEK(47) │
- │ │
- │'=========================================================│
- │'Bizim modemin IRQ'su için 8259'dan izin alìnìyor │
- │ RESTORE IRQSerbest │
- │ REDIM Oku(31) │
- │ DEF SEG = VARSEG(Oku(0)) │
- │ │
- │ FOR PicMask = 0 TO 31 │
- │ READ D% │
- │ IF PicMask = 7 THEN D% = IrqNo │
- │ POKE VARPTR(Oku(0)) + PicMask, D% │
- │ NEXT PicMask │
- │ │
- │ CALL ABSOLUTE(VARPTR(Oku(0))) │
- │ │
- │'Modemin açìlmasì tamamlandì │
- │END SUB │
- └──────────────────────────────────────────────────────────┘
-
-
- ┌───────────────────────┐
- │ Modem Kapama Yordamì │
- ┌─────────────────┴───────────────────────┴────────────────┐
- │SUB ModemiKapa (ModemAdresi) │
- │'Modem kapatìlìyor │
- │ PRINT #1, "ATH" │
- │ OUT ModemAdresi + 4, (INP(ModemAdresi + 4) AND 252) │
- │ CLOSE #1 │
- │'=========================================================│
- │'Eski deºerler iade ediliyor │
- │ DEF SEG = 0 │
- │ FOR I = 40 TO 63: 'ÿnterrupt adresleri │
- │ POKE I, Sakla(I - 40) │
- │ NEXT │
- │ OUT &H21, Sakla(24) 'PIC deºerleri │
- │ OUT &HA1, Sakla(25) │
- │ POKE 1026, Sakla(26) 'Com2 adresi │
- │ POKE 1027, Sakla(27) │
- │END SUB │
- └──────────────────────────────────────────────────────────┘
-
- ┌─────────────────────────────┐
- │ Terminal (Yerel iletiƒim) │
- ┌─────────────┴─────────────────────────────┴──────────────┐
- │SUB Terminal │
- │COLOR 7, 1 │
- │CLS │
- │LOCATE 1, 1, 1: PRINT "Modem ÿnstall ediliyor" │
- │PRINT #1, "ATZ" │
- │RR = FIX(TIMER) │
- │DO │
- │ IF LOC(1) > 0 THEN B$ = B$ + INPUT$(LOC(1), #1) │
- │ IF INSTR(B$, "OK") > 0 THEN EXIT DO │
- │ IF FIX(TIMER) - RR > 5 THEN │
- │ PRINT "Modem Port Adresi ve IRQ deºerleri hatalì !!" │
- │ EXIT SUB │
- │ END IF │
- │LOOP │
- │ │
- │LOCATE 1, 1, 1 │
- │PRINT "Modem uygun bulundu, baƒladì (Çìkìƒ için Esc)" │
- │DO │
- │ A$ = INKEY$ │
- │ IF A$ <> "" THEN │
- │ IF ASC(A$) = 27 THEN EXIT DO │
- │ PRINT #1, A$; : 'Modem girdisi │
- │ ELSE │
- │ IF LOC(1) > 0 THEN │
- │ B$ = INPUT$(LOC(1), #1) │
- │ PRINT #2, B$; : 'Modem çìktìsì │
- │ END IF │
- │ END IF │
- │LOOP │
- │END SUB │
- └──────────────────────────────────────────────────────────┘
-
- Basic'de modemin programlanmasì ile ilgili yazì dizimiz burada sona
- ermektedir. Modemin programlanmasìnda sadece temel taƒlarì verilmiƒtir.
- Bilgisayarìn bir baƒka bilgisayar ile telefon hattì kullanarak irtibatìnì
- verilen bilgiler ile saºlayabilirsiniz. Ve uzaktaki bir arkadaƒìnìz ile
- klavye üzerinden sohbet edebilirsiniz.
-
- Ancak dosya transferi için iki birim arasìnda bir dosya transfer
- protolu yapìlmasì gerekir. Harici olarak kullanìlan protokeller piyasada
- mevcuttur. En yaygìn olan Z modem iletiƒim protolu olup DSZ.EXE veya DSZ.COM
- isimli programlar ile haricen kullanìlabilir.
-
- Görüƒmek üzere....
-
- Adres:
- PC World/Türkiye
- PS-Gürol Demir
- Eski Büyükdere cad.
- Sanayi mah. Behçet sokak
- No:25/B Kat:5
- 80650 4.Levent / ÿSTANBUL
-
- Internet : gurold@doruk.com.tr
-